/*
 *
 * 名称：六十四卦
 * 功能：易经的六十四卦功能
 * 作者：清河张
 * 时间：2025.05.30
 *
 */
#ifndef GUA64_H
#define GUA64_H
#include "gua8.h"
#include "zhouqi.h"
#include "wuxing.h"
// 01
// 乾为天；
// 02
// 坤为地；
// 03
// 水雷屯；
// 04
// 山水蒙；
// 05
// 水天需；
// 06
// 天水讼；
// 07
// 地水师；
// 08
// 水地比；
// 09
// 风天小畜（续）；
// 10
// 天泽履；
// 11
// 地天泰；
// 12
// 天地否；
// 13
// 天火同人；
// 14
// 火天大有；
// 15
// 地山谦；
// 16
// 雷地豫；
// 17
// 泽雷随；
// 18
// 山风蛊；
// 19
// 地泽临；
// 20
// 风地观；
// 21
// 火雷噬嗑；
// 22
// 山火贲（碧）；
// 23
// 山地剥；
// 24
// 地雷复；
// 25
// 天雷无妄；
// 26
// 山天大畜（续）；
// 27
// 山雷颐；
// 28
// 泽风大过；
// 29
// 坎为水；
// 30
// 离为火；
// 31
// 泽山咸；
// 32
// 雷风恒；
// 33
// 天山遁；
// 34
// 雷天大壮
// 35
// 火地晋；
// 36
// 地火明夷；
// 37
// 风火家人；
// 38
// 火泽睽；
// 39
// 水山蹇（简）；
// 40
// 雷水解；
// 41
// 山泽损；
// 42
// 风雷益；
// 43
// 泽天夬（怪）；
// 44
// 天风姤；
// 45
// 泽地萃；
// 46
// 地风升；
// 47
// 泽水困；
// 48
// 水风井；
// 49
// 泽火革；
// 50
// 火风鼎；
// 51
// 震为雷；
// 52
// 艮为山；
// 53
// 风山渐；
// 54
// 雷泽归妹；
// 55
// 雷火丰；
// 56
// 火山旅；
// 57
// 巽为风；
// 58
// 兑为泽；
// 59
// 风水涣；
// 60
// 水泽节；
// 61
// 风泽中孚；
// 62
// 雷山小过；
// 63
// 水火既济；
// 64
// 火水未济；

class FUGUA_T : public CT
{
public:

    //默认构造函数
    FUGUA_T();
    //全参数构造函数，默认属性配置
    FUGUA_T(int id, unsigned xiang, int xu, const char* name);


    union XIANG
    {
#pragma pack(push, 1)
        struct
        {
            unsigned _1:1;
            unsigned _2:1;
            unsigned _3:1;
            unsigned _4:1;
            unsigned _5:1;
            unsigned _6:1;
            unsigned _a:1;
            unsigned _b:1;
        };
#pragma pack(pop)
        unsigned _v : 8;

        //初始化
        XIANG(unsigned v = 0);
        //初始化
        XIANG(const DANGUA_T::XIANG& sg, const DANGUA_T::XIANG& xg);

        //正卦、本卦、原卦
        XIANG zheng();
        //互卦
        //抽二、三、四为下互，抽三、四、五为上互
        XIANG hu();
        //对卦、错卦、旁通
        //各爻取反
        XIANG cuo();
        //综卦、反卦、覆卦
        //倒180度
        XIANG zong();
        //变卦
        //yao为爻序列，为0不变，为1则变
        XIANG bian();

        bool invalid() const;
    };

    XIANG xiang() const;
    int xu() const;
protected:
private:
    XIANG _xiang;
    int _xu;
};

typedef ZHOUQI<FUGUA_T, 65> GUA64PARENT;

class GUA64 : public GUA64PARENT
{
public:
    //默认构造函数
    GUA64();
    //初始化到指定对象
    GUA64(int id);
    //使用单个对象初始化
    GUA64(const FUGUA_T& GUA64);
    //使用父类初始化
    GUA64(const GUA64PARENT& parent);
    //运算
    GUA64& operator = (const GUA64PARENT& GUA64);
    GUA64& operator = (const FUGUA_T& GUA64);
    GUA64& operator = (int id);

    static GUA64 fu(const GUA8& s, const GUA8& x);
    static GUA64 xiang(const XIANG& x);
private:
};

#endif // GUA64_H
